﻿using System;
using System.Timers;
using Timer = System.Threading.Timer;

public class AlarmClock
{
    // 定义 Tick 和 Alarm 事件  
    public event Action? Tick;
    public event Action? Alarm;

    private readonly Timer timer; // 用于定时器  
    private DateTime alarmTime;    // 定义闹钟响铃的时间  
    private bool isAlarmSet = false; // 闹钟是否设置的标志  

    public AlarmClock()
    {
        timer = new Timer(OnTimerElapsed!, null, 0, 1000); // 每秒触发一次  
    }

    // 设置闹钟时间  
    public void SetAlarm(DateTime time)
    {
        alarmTime = time;
        isAlarmSet = true;
        Console.WriteLine($"闹钟设置为：{alarmTime}");
    }

    // 启动定时器  
    public void Start()
    {
        // Timer already started in constructor, no need to start again
        Console.WriteLine("闹钟开始运行...");
    }

    // 停止定时器  
    public void Stop()
    {
        timer.Change(Timeout.Infinite, Timeout.Infinite);
        Console.WriteLine("闹钟停止运行...");
    }

    // 每秒触发的事件处理  
    private void OnTimerElapsed(object? state)
    {
        // 触发 Tick 事件  
        Tick?.Invoke();

        // 检查是否达到了设定的闹钟时间  
        if (isAlarmSet && DateTime.Now >= alarmTime)
        {
            // 触发 Alarm 事件  
            Alarm?.Invoke();
            isAlarmSet = false; // 重置闹钟设置  
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        var alarmClock = new AlarmClock();

        // 订阅 Tick 事件  
        alarmClock.Tick += () => Console.WriteLine($"嘀嗒... 当前时间：{DateTime.Now:HH:mm:ss}");

        // 订阅 Alarm 事件  
        alarmClock.Alarm += () => Console.WriteLine("闹钟响铃! 是时候起床了!");

        // 设置闹钟时间为 5 秒后  
        DateTime alarmTime = DateTime.Now.AddSeconds(5);
        alarmClock.SetAlarm(alarmTime);

        // 启动闹钟  
        alarmClock.Start();

        // 主线程持续运行，直到用户按下任意键  
        Console.WriteLine("按任意键停止闹钟...");
        Console.ReadKey();

        // 停止闹钟  
        alarmClock.Stop();
    }
}
